﻿using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;

namespace Emporium_Web
{
    public partial class ItemsForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de estilo
        /// </summary>
        private int EstiloId
        {
            get { return ViewState["RequestCodeEstilo"] == null ? -1 : (int)ViewState["RequestCodeEstilo"]; }
            set { ViewState["RequestCodeEstilo"] = value; }
        }

        /// <summary>
        /// Es el código de variante
        /// </summary>
        private int VarianteId
        {
            get { return ViewState["VarianteId"] == null ? -1 : (int)ViewState["VarianteId"]; }
            set { ViewState["VarianteId"] = value; }
        }

        /// <summary>
        /// Es el código de componente
        /// </summary>
        private int ComponenteId
        {
            get { return ViewState["ComponenteId"] == null ? -1 : (int)ViewState["ComponenteId"]; }
            set { ViewState["ComponenteId"] = value; }
        }


        /// <summary>
        /// Es el código de variante item
        /// </summary>
        private int VarianteItemId
        {
            get { return ViewState["VarianteItemId"] == null ? -1 : (int)ViewState["VarianteItemId"]; }
            set { ViewState["VarianteItemId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        protected void Page_Init(object sender, EventArgs e)
        {            
            itemSearch.Seleccionado += new EventHandler(seleccionItem_Click);
            telaSearch.Seleccionado += new EventHandler(seleccionTela_Click);  
        }


        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {                  

                    errorMessage.Visible = false;
                    Master.ActualizaMenu(MenuPrincipal.Desarrollo, (int)MenuDesarrollo.Estilo);

                    Master.AgregarBreadcrumb("Estilo", "#", true);
                    Master.AgregarBreadcrumb("Listado", "EstiloList.aspx", false);
                    Master.AgregarBreadcrumb("Consumos", "#", false);                    
                    Master.AgregarBreadcrumb("Items", "#", false);
                    leyendaForm.Text = Resources.Leyendas.FormAdicionar;

                    int EstiloId = 0;
                    if (Request.QueryString["EstiloId"] != null && Int32.TryParse(Request.QueryString["EstiloId"], out EstiloId))
                    {
                        this.EstiloId = EstiloId;
                    }
                    int VarianteId = 0;
                    if (Request.QueryString["VarianteId"] != null && Int32.TryParse(Request.QueryString["VarianteId"], out VarianteId))
                    {
                        this.VarianteId = VarianteId;
                    }
                    int ComponenteId = 0;
                    if (Request.QueryString["ComponenteId"] != null && Int32.TryParse(Request.QueryString["ComponenteId"], out ComponenteId))
                    {
                        this.ComponenteId = ComponenteId;
                    }
                    int VarianteItemId = 0;
                    if (Request.QueryString["VarianteItemId"] != null && Int32.TryParse(Request.QueryString["VarianteItemId"], out VarianteItemId))
                    {
                        this.VarianteItemId = VarianteItemId;
                    }
                    
                    LlenarDatosDefault();
                    EstablecerComportamiento();
                    EstablecerValidaciones();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();
                Response.Redirect("ConsumosXEstilo.aspx?VarianteId=" + this.VarianteId + "&ComponenteId=" + this.ComponenteId + "&EstiloId=" + this.EstiloId + "&VarianteItemId=" + this.VarianteItemId);
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("ConsumosXEstilo.aspx?VarianteId=" + this.VarianteId + "&ComponenteId=" + this.ComponenteId + "&EstiloId=" + this.EstiloId + "&VarianteItemId=" + this.VarianteItemId);
        }

        protected void seleccionItem_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var item = database.TG_Item.First(c => c.Item_Id == itemSearch.CodigoSeleccionado);
            if (item != null)
                ddlUnidadMedida.SelectedValue = item.UniMed_Id.ToString();
        }

        protected void seleccionTela_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var item = database.TG_Tela.First(c => c.Tela_Id == telaSearch.CodigoSeleccionado);
            if (item != null)
                ddlUnidadMedida.SelectedValue = item.UniMed_Id.ToString();
        }
        

        /// <summary>
        /// Llena los mensajes de error de las validaciones del formulario.
        /// </summary>
        private void EstablecerValidaciones()
        {
         
        }

        /// <summary>
        /// Prepara el formulario para la operación que se haya elegido (Agregar, Modificar o Consultar)
        /// </summary>
        private void EstablecerComportamiento()
        {
            int accion = 0;

            if (Request.QueryString["Operacion"] != null && Int32.TryParse(Request.QueryString["Operacion"].ToString(), out accion))
            {
                switch (accion)
                {
                    case (int)AccionesForm.Consultar:
                        this.Operacion = AccionesForm.Consultar;
                        leyendaForm.Text = Resources.Leyendas.FormConsultar;                       
                        LlenarDatosForm();
                        #region Inhabilita controles
                        btnGrabar.Visible = false;
                        txtConsumo.Enabled = false;
                        txtConsumoAlterno.Enabled = false;                        
                        ddlUnidadMedidaAlterno.Enabled = false;
                        txtObservaciones.Enabled = false;
                        #endregion
                        break;
                    case (int)AccionesForm.Modificar:
                        this.Operacion = AccionesForm.Modificar;
                        leyendaForm.Text = Resources.Leyendas.FormModificar;                       
                        LlenarDatosForm();
                        EstablecerValidaciones();
                        break;
                    default:
                        this.Operacion = AccionesForm.Adicionar;
                        leyendaForm.Text = Resources.Leyendas.FormAdicionar;                                       
                        EstablecerValidaciones();                       
                        break;
                }
            }

        }

        /// <summary>
        /// Llena los datos del formulario con la información de la variante y componente.
        /// </summary>        
        private void LlenarDatosDefault()
        {
            TablasDataContext database = new TablasDataContext();

            var estilo = database.DE_Estilo.First(c => c.Id == this.EstiloId);
            var variante = database.DE_Variante.First(c => c.Variante_Id == this.VarianteId);
            var componente = database.DE_Componente.First(c => c.Componente_Id == this.ComponenteId);

            var listaVarianteItems = from varianteItems in database.DE_VarianteItem
                                     where varianteItems.Variante_Id == this.VarianteId
                                        && varianteItems.Componente_Id == this.ComponenteId
                                     select varianteItems;

            txtEstilo.Text = estilo.Descripcion;
            txtVariante.Text = variante.Variante_Descripcion;
            txtComponente.Text = componente.Componente_Descripcion;

            if (listaVarianteItems.Count() > 0)
            {
                txtSecuencia.Text = (listaVarianteItems.Count() + 1).ToString("000");
            }
            else
            {
                txtSecuencia.Text = "001";
            }

            if (componente.Componente_TipoItem == 'I')
            {
                itemSearch.Visible = true;
                telaSearch.Visible = false;
            }
            else
            {
                itemSearch.Visible = false;
                telaSearch.Visible = true;
            }

            //Llenando combos
            ddlUnidadMedida.DataSource = from unidades in database.TG_UnidadMedida
                                         select unidades;
            ddlUnidadMedida.DataBind(); 
            ddlUnidadMedida.Items.Insert(0, (new ListItem("----", "0")));
            ddlUnidadMedida.SelectedValue = "0";

            ddlUnidadMedidaAlterno.DataSource = from unidades in database.TG_UnidadMedida
                                                select unidades;
            ddlUnidadMedidaAlterno.DataBind();           
            ddlUnidadMedidaAlterno.Items.Insert(0, (new ListItem("----", "0")));
            ddlUnidadMedidaAlterno.SelectedValue = "0";
        }


        /// <summary>
        /// Llena los datos del formulario con la información del estilo.
        /// </summary>        
        private void LlenarDatosForm()
        {
            TablasDataContext database = new TablasDataContext();

            DE_VarianteItem varianteItem = (from varianteItems in database.DE_VarianteItem
                                            where varianteItems.VarIte_Id == this.VarianteItemId
                                            select varianteItems).First();


            if (varianteItem != null)
            {

                if (itemSearch.Visible)
                {
                    itemSearch.CodigoSeleccionado = varianteItem.Item_Id.Value;
                    itemSearch.DescripcionSeleccionado = varianteItem.TG_Item.Item_Descripcion;
                }
                if (telaSearch.Visible)
                {
                    telaSearch.CodigoSeleccionado = varianteItem.Tela_Id.Value;
                    telaSearch.DescripcionSeleccionado = varianteItem.TG_Tela.Tela_Descripcion;
                }

                if (varianteItem.VarIte_ConsumoBase != null && varianteItem.UniMed_Id_Base != null)
                {
                    txtConsumo.Text = varianteItem.VarIte_ConsumoBase.Value.ToString();
                    ddlUnidadMedida.SelectedValue = varianteItem.UniMed_Id_Base.ToString();
                }
                if (varianteItem.VarIte_ConsumoAlterno != null && varianteItem.UniMed_Id_Alterno != null)
                {
                    txtConsumoAlterno.Text = varianteItem.VarIte_ConsumoAlterno.Value.ToString();
                    ddlUnidadMedidaAlterno.SelectedValue = varianteItem.UniMed_Id_Alterno.ToString();
                }
                if (varianteItem.VarIte_Secuencia != null)
                {
                    txtSecuencia.Text = varianteItem.VarIte_Secuencia.ToString("000");
                }
                if (varianteItem.VarIte_Observacion != null)
                {
                    txtObservaciones.Text = varianteItem.VarIte_Observacion;
                }
            }
        }

        private void Grabar()
        {
            switch (this.Operacion)
            {
                case AccionesForm.Adicionar:
                    Insertar();
                    break;
                case AccionesForm.Modificar:
                    Actualizar();
                    break;
                default:
                    lblErrorMessage.Text = Resources.MensajesValidacion.InvalidOperation;
                    errorMessage.Visible = true;
                    break;
            }
        }

        private void Actualizar()
        {
            TablasDataContext database = new TablasDataContext();

            DE_VarianteItem varianteItem = (from varianteItems in database.DE_VarianteItem
                                            where varianteItems.VarIte_Id == this.VarianteItemId
                                            select varianteItems).First();

            if (itemSearch.Visible)
                varianteItem.Item_Id = itemSearch.CodigoSeleccionado;
            if (telaSearch.Visible)
                varianteItem.Tela_Id = telaSearch.CodigoSeleccionado;

            if (txtConsumo.Text != string.Empty)
            {
                varianteItem.VarIte_ConsumoBase = Convert.ToDecimal(txtConsumo.Text);
                varianteItem.UniMed_Id_Base = Convert.ToInt32(ddlUnidadMedida.SelectedValue);
            }
            if (txtConsumoAlterno.Text != string.Empty)
            {
                varianteItem.VarIte_ConsumoAlterno = Convert.ToDecimal(txtConsumoAlterno.Text);
                varianteItem.UniMed_Id_Alterno = Convert.ToInt32(ddlUnidadMedidaAlterno.SelectedValue);
            }

            if (txtObservaciones.Text != string.Empty)
            {
                varianteItem.VarIte_Observacion = txtObservaciones.Text;
            }

            database.SubmitChanges();
        }

        private void Insertar()
        {
            TablasDataContext database = new TablasDataContext();

            DE_VarianteItem varianteItem = new DE_VarianteItem();

            varianteItem.Variante_Id = this.VarianteId;
            varianteItem.Componente_Id = this.ComponenteId;

            if (itemSearch.Visible)
                varianteItem.Item_Id = itemSearch.CodigoSeleccionado;
            if (telaSearch.Visible)
                varianteItem.Tela_Id = telaSearch.CodigoSeleccionado;

            if (txtSecuencia.Text != string.Empty)
            {
                varianteItem.VarIte_Secuencia = Convert.ToDecimal(txtSecuencia.Text);
            }
            if (txtConsumo.Text != string.Empty && ddlUnidadMedida.SelectedValue != "0")
            {
                varianteItem.VarIte_ConsumoBase = Convert.ToDecimal(txtConsumo.Text);
                varianteItem.UniMed_Id_Base = Convert.ToInt32(ddlUnidadMedida.SelectedValue);
            }
            if (txtConsumoAlterno.Text != string.Empty && ddlUnidadMedidaAlterno.SelectedValue != "0")
            {
                varianteItem.VarIte_ConsumoAlterno = Convert.ToDecimal(txtConsumoAlterno.Text);
                varianteItem.UniMed_Id_Alterno = Convert.ToInt32(ddlUnidadMedidaAlterno.SelectedValue);
            }

            if (txtObservaciones.Text != string.Empty)
            {
                varianteItem.VarIte_Observacion = txtObservaciones.Text;
            }

            database.DE_VarianteItem.InsertOnSubmit(varianteItem);
            database.SubmitChanges();
        }
    }
}